/** 通过列 字母号 获取数值号 */
function converToNum(str) {
    let count = str.length;
    let exp = count - 1;
    let result = 0;
    for (let i = 0; i < count; i++) {
        let v = str.codePointAt(i) - 64;
        result += Math.pow(26, exp) * v;
        exp--;
    }

    return result;
}

/**
 * 执行操作
 * @param {string} viewSheetName 查看参考的工作表名
 * @param {string} syncSheetName 被同步的工作表名
 * @param {number} viewStartRow 查看表的开始行
 * @param {number} syncStartRow 被同步表的开始行
 * @param {string} viewHeadColumn 查看表的比对纵列 字母号
 * @param {string} syncHeadColumn 被同步表的比对纵列 字母号
 * @param {string[]} viewCopyColumns 查看表复制到同步表的 字母号列表
 * @param {string[]} syncCopyColumns 被同步表复从查看表复制过来的 字母号列表
 */
function run(
    viewSheetName,
    syncSheetName,
    viewStartRow,
    syncStartRow,
    viewHeadColumn,
    syncHeadColumn,
    viewCopyColumns,
    syncCopyColumns
) {

    // 定义表Sheet1和表Sheet2
    let ws1 = ThisWorkbook.Sheets(viewSheetName);
    let ws2 = ThisWorkbook.Sheets(syncSheetName);
    if (!ws1 || !ws2) {
        let info = `工作表没找到,确认 表 ${viewSheetName} 、 ${syncSheetName} 是否存在`;
        console.error(info);
        alert(info);
        return;
    }
    // 找到表Sheet1和表Sheet2的最后一行
    let dataRange1 = ws1.Range(viewHeadColumn + "1").CurrentRegion;
    let dataRange2 = ws2.Range(syncHeadColumn + "1").CurrentRegion;
    //找到表Sheet1 的最大列数
    let lastRow1 = dataRange1.Row + dataRange1.Rows.Count - 1;
    //找到表Sheet2 的最大列数
    let lastRow2 = dataRange2.Row + dataRange2.Rows.Count - 1;

    let vHNum = converToNum(viewHeadColumn);
    let sHNum = converToNum(syncHeadColumn);

    let copyMax = Math.min(viewCopyColumns.length, syncCopyColumns.length);

    // 遍历 view 表中的每一行数据
    for (let i = viewStartRow; i <= lastRow1; i++) {
        // 遍历 sync 表中的每一行数据
        for (let j = syncStartRow; j <= lastRow2; j++) {
            let v1 = ws1.Cells(i, vHNum).Value2;
            let v2 = ws2.Cells(j, sHNum).Value2;
            // 如果 view 表 的 指定列与 sync表的 指定列数据相同，则进行数据复制
            if (v1 && v1 == v2) {
                for (let k = 0; k < copyMax; k++) {
                    let vcNum = viewCopyColumns[k];
                    let scNum = syncCopyColumns[k];
                    // 将view表的指定列 当前行的数据复制到 sync表的 指定列当前行
                    ws2.Cells(j, scNum).Value2 = ws1.Cells(i, vcNum).Value2;
                }
                break;
            }
        }
    }
}

/**
 * 逐行比对两工作表的指定列，当前行数据相同时，执行指定列的数据复制操作。
 */
function 比对两表_数据同步() {
    run(
        "Sheet1",           //查看参考的工作表名
        "Sheet2",           //被同步的工作表名
        2,                  //查看表的开始行
        5,                  //被同步表的开始行
        "D",                //查看表的比对纵列 字母号
        "D",                //被同步表的比对纵列 字母号
        ["F", "S"],         //查看表复制到同步表的 字母号列表
        ["C", "E"]          //被同步表复从查看表复制过来的 字母号列表
    );
}



